﻿using System;
using System.ComponentModel.DataAnnotations;
using EFCore.Core.Extensions;
namespace EFCore.Core.DataAnnotations
{
    /// <summary>
    /// 验证手机号
    /// </summary>
    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
    public class PhoneNumberAttribute : DataTypeAttribute
    {
        private string _value;

        /// <summary>
        /// 初始化 <see cref="T:MobilePhoneNumberAttribute"/> 类的实例。
        /// </summary>
        public PhoneNumberAttribute()
            : base(DataType.PhoneNumber)
        {

        }

        #region Overrides of DataTypeAttribute

        /// <summary>
        /// 检查数据字段的值是否有效。
        /// </summary>
        /// <returns>
        /// 如果指定的值有效或 null，则为 true；否则，为 false。
        /// </returns>
        /// <param name="value">要验证的数据字段值。</param>
        public override bool IsValid(object value)
        {
            if (value == null)
            {
                return true;
            }
            string input = value as string;
            if (input == null)
            {
                return false;
            }
            _value = input;
            if (input.Length != 11)
            {
                return false;
            }
            return input.IsMobileNumberRestrict();
        }

        /// <summary>
        /// 基于发生错误的数据字段对错误消息应用格式设置。
        /// </summary>
        /// <returns>
        /// 带有格式的错误消息的实例。
        /// </returns>
        /// <param name="name">要包括在带有格式的消息中的名称。</param>
        public override string FormatErrorMessage(string name)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                name = "手机号";
            }
            if (_value.Length != 11)
            {
                return "{0} 长度必须应该等于{1}位".FormatWith(name, 11);
            }
            if (!_value.IsMobileNumberRestrict())
            {
                return "{0} 格式不正确，或号段不存在".FormatWith(name);
            }
            return base.FormatErrorMessage(name);
        }

        #endregion
    }
}
